/*
 * Borovicska Szglab4 2011
 * @package circuit1
 */
package circuit1;

/**
 *
 * @author Erik
 */
import java.util.ArrayList;

public class Circuit {

    protected ICircuitAdapter adapter;
    /**
     * Stabilitast vizsgalo osztaly
     */
    protected StabilityObserver stabilityObserver;
    /**
     * Az aramkor nativ elemlistaja
     */
    protected ArrayList<IElement> elements;
    /**
     * Az aramkor vezetek listaja
     */
    protected ArrayList<Wire> wires;
    /**
     * Kompozit tipusokat tarolo lista
     */
    protected ArrayList<CompositeType> compositeTypes;
    /**
     * Az aramkorben levo kompozit elemek listaja
     */
    protected ArrayList<Composite> composites;
    
    private ArrayList<String> from = new ArrayList<String>();
    private ArrayList<String> to = new ArrayList<String>();
    
    private ArrayList<Switch> switches;
    private ArrayList<Generator> generators;
    
    /**
     * Letrehozzuk a fent definialt objektumokat
     */
    
    
    public Circuit() {
        compositeTypes = new ArrayList<CompositeType>();
        composites = new ArrayList<Composite>();
        elements = new ArrayList<IElement>();
        wires = new ArrayList<Wire>();
        stabilityObserver = new StabilityObserver();
        switches = new ArrayList<Switch>();
        generators = new ArrayList<Generator>();
    }
    /**
     * Elem hozzaadasat megvalosito objektum
     * @param e 
     */
    public void addElement(IElement e) {
        elements.add(e);
    }
    
    /**
     * Visszaadja az elemet ID szerint
     * @param id
     * @return 
     */
    public IElement getElementById(Integer id) {
        return elements.get(id);
    }
    
    /**
     * Visszaadja az elemet ID szerint
     * @param id
     * @return 
     */
    public IElement getElementById(String id) {
        for (IElement e : elements) {
            if (e.getId().equals(id)) {
                return e;
            }
        }
        return null;
    }
    
    /*
     * Visszaadja az elem listat
     */
    public ArrayList<IElement> getElements() {
        return elements;
    }
    
    public ArrayList<Generator> getGenerators() {
        return generators;
    }
    
    public ArrayList<Switch> getSwitches() {
        return switches;
    }
    
    /**
     * Feliratkoztatja a vezetek megfigyelesere az obszervert
     * @param w 
     */
    public void addWire(Wire w) {
        if (!isWireExists(w.getId())) {
            wires.add(w);
            w.addObserver(stabilityObserver);
        }
    }
    
    public void setWires(ArrayList<String> fw, ArrayList<String> tw){
        from = fw;
        to = tw;
    }
    
    public ArrayList<String> getWiresFrom(){
        return from;
    }
    
    public ArrayList<String> getWiresTo(){
        return to;
    }
    
    /**
     * Megmondja hogy letezik-e a parameterul adott azonositoju vezetek
     * @param ID
     * @return 
     */
    private boolean isWireExists(String ID) {
        for (int i = 0; i < wires.size(); i++) {
            if (wires.get(i).getId().equals(ID)) {
                return true;
            }
        }
        return false;
    }
    
    /**
     * Visszaadja a vezeteket az ID szerint
     * @param id
     * @return 
     */
    public Wire getWireById(Integer id) {
        return wires.get(id);
    }
    
    /**
     * Visszaadja a kompozittipus  listat
     * @return 
     */
    public ArrayList<CompositeType> getCompositeTypes() {
        return compositeTypes;
    }
    
    /**
     * Visszaadja a vezeteket a parameterul kapott ID alapjan
     * @param ID
     * @return 
     */
    public Wire getWireById(String ID) {
        for (int i = 0; i < wires.size(); i++) {
            if (wires.get(i).getId().equals(ID)) {
                //System.out.println(ID + " " + wires.get(i).getId());
                return wires.get(i);
            }
        }
        //System.out.println(ID + " nem letezik!!!");
        return null;
    }
    
    /**
     * Visszaadja a vezetekek szamat
     * @return 
     */
    public Integer getWireCount() {
        return wires.size();
    }
    
    /**
     * Visszaadja az elemek szamat a listaban
     * @return 
     */
    public Integer getElementCount() {
        return elements.size();
    }

    /**
     * Egy uj kompozit elem tipust ad hozza a kompozit tipus listahoz
     * @param c 
     */
    public void addCompositeType(CompositeType c) {
        compositeTypes.add(c);
        //System.out.println("add comp type");
    }

    /**
     * Egy kompozit elemet ad hozza a kompozit elem listahoz
     * @param c 
     */
    public void addCompositeElement(Composite c) {
        composites.add(c);
        //System.out.println("add comp elem");
    }

    /**
     * Visszaadja a kompozit elemeket tarolo listat
     * @return 
     */
    public ArrayList<Composite> getCompositeElements() {
        return composites;
    }

    /**
     * Visszaadja a stabilitast vizsgalo obszerver objektumot
     * @return 
     */
    public StabilityObserver getStabilityObserver() {
        return stabilityObserver;
    }

    /**
     * Visszaadja a kompozit tipust a neve alapjan
     * @param str
     * @return 
     */
    public CompositeType getCompositeTypeByName(String str) {
        for (CompositeType c : compositeTypes) {
            if (c.getName().equals(str)) {
                return c;
            }
        }
        return null;
    }
    
    public Composite getCompositeElementByName(String str) {
        for (Composite c : composites) {
            if (c.getName().equals(str)) {
                return c;
            }
        }
        return null;
    }
    
    public ArrayList<Wire> getWires(){
        return wires;
    }

}
